{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt \n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.datasets import load_boston"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead tr th {\n",
       "        text-align: left;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th>CRIM</th>\n",
       "      <th>ZN</th>\n",
       "      <th>INDUS</th>\n",
       "      <th>CHAS</th>\n",
       "      <th>NOX</th>\n",
       "      <th>RM</th>\n",
       "      <th>AGE</th>\n",
       "      <th>DIS</th>\n",
       "      <th>RAD</th>\n",
       "      <th>TAX</th>\n",
       "      <th>PTRATIO</th>\n",
       "      <th>B</th>\n",
       "      <th>LSTAT</th>\n",
       "      <th>ONE</th>\n",
       "      <th>PRICE</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.00632</td>\n",
       "      <td>18.0</td>\n",
       "      <td>2.31</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.538</td>\n",
       "      <td>6.575</td>\n",
       "      <td>65.2</td>\n",
       "      <td>4.0900</td>\n",
       "      <td>1.0</td>\n",
       "      <td>296.0</td>\n",
       "      <td>15.3</td>\n",
       "      <td>396.90</td>\n",
       "      <td>4.98</td>\n",
       "      <td>1</td>\n",
       "      <td>24.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.02731</td>\n",
       "      <td>0.0</td>\n",
       "      <td>7.07</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.469</td>\n",
       "      <td>6.421</td>\n",
       "      <td>78.9</td>\n",
       "      <td>4.9671</td>\n",
       "      <td>2.0</td>\n",
       "      <td>242.0</td>\n",
       "      <td>17.8</td>\n",
       "      <td>396.90</td>\n",
       "      <td>9.14</td>\n",
       "      <td>1</td>\n",
       "      <td>21.6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.02729</td>\n",
       "      <td>0.0</td>\n",
       "      <td>7.07</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.469</td>\n",
       "      <td>7.185</td>\n",
       "      <td>61.1</td>\n",
       "      <td>4.9671</td>\n",
       "      <td>2.0</td>\n",
       "      <td>242.0</td>\n",
       "      <td>17.8</td>\n",
       "      <td>392.83</td>\n",
       "      <td>4.03</td>\n",
       "      <td>1</td>\n",
       "      <td>34.7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.03237</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.18</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.458</td>\n",
       "      <td>6.998</td>\n",
       "      <td>45.8</td>\n",
       "      <td>6.0622</td>\n",
       "      <td>3.0</td>\n",
       "      <td>222.0</td>\n",
       "      <td>18.7</td>\n",
       "      <td>394.63</td>\n",
       "      <td>2.94</td>\n",
       "      <td>1</td>\n",
       "      <td>33.4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.06905</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.18</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.458</td>\n",
       "      <td>7.147</td>\n",
       "      <td>54.2</td>\n",
       "      <td>6.0622</td>\n",
       "      <td>3.0</td>\n",
       "      <td>222.0</td>\n",
       "      <td>18.7</td>\n",
       "      <td>396.90</td>\n",
       "      <td>5.33</td>\n",
       "      <td>1</td>\n",
       "      <td>36.2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      CRIM    ZN INDUS CHAS    NOX     RM   AGE     DIS  RAD    TAX PTRATIO  \\\n",
       "0  0.00632  18.0  2.31  0.0  0.538  6.575  65.2  4.0900  1.0  296.0    15.3   \n",
       "1  0.02731   0.0  7.07  0.0  0.469  6.421  78.9  4.9671  2.0  242.0    17.8   \n",
       "2  0.02729   0.0  7.07  0.0  0.469  7.185  61.1  4.9671  2.0  242.0    17.8   \n",
       "3  0.03237   0.0  2.18  0.0  0.458  6.998  45.8  6.0622  3.0  222.0    18.7   \n",
       "4  0.06905   0.0  2.18  0.0  0.458  7.147  54.2  6.0622  3.0  222.0    18.7   \n",
       "\n",
       "        B LSTAT ONE PRICE  \n",
       "0  396.90  4.98   1  24.0  \n",
       "1  396.90  9.14   1  21.6  \n",
       "2  392.83  4.03   1  34.7  \n",
       "3  394.63  2.94   1  33.4  \n",
       "4  396.90  5.33   1  36.2  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "4 502 14\n"
     ]
    }
   ],
   "source": [
    "boston_dict=load_boston()\n",
    "data = boston_dict['data']\n",
    "target = boston_dict['target']\n",
    "feature_names = boston_dict['feature_names']\n",
    "info = boston_dict['DESCR']\n",
    "\n",
    "df = pd.DataFrame(data=data, columns=[feature_names])\n",
    "df['ONE'] = 1\n",
    "df['PRICE'] = target\n",
    "display(df.head())\n",
    "\n",
    "X = df[feature_names].copy()\n",
    "X['ONE'] = 1\n",
    "X = X.values\n",
    "X = X/X.max(axis=0)\n",
    "\n",
    "\n",
    "y=target\n",
    "y=y/max(y)\n",
    "y=y.reshape((-1,1))\n",
    "\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, train_size = 4, random_state = 11)\n",
    "\n",
    "n_train=X_train.shape[0]\n",
    "n_test=X_test.shape[0]\n",
    "m=X_train.shape[1]\n",
    "print(n_train, n_test, m)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 510,
   "metadata": {},
   "outputs": [],
   "source": [
    "def objective(X, w):\n",
    "    y_hat = np.dot(X, w)\n",
    "    return y_hat\n",
    "\n",
    "def cost(y, y_hat, w, n):\n",
    "    #y_hat = objective()\n",
    "    cost = np.sum((y-y_hat)**2)/n + _lambda/(2*m) * np.sum(w ** 2)\n",
    "    return cost\n",
    "\n",
    "def real_cost(y, y_hat, w, n):\n",
    "    #y_hat = objective()\n",
    "    cost = np.sum((y-y_hat)**2)/n\n",
    "    return cost\n",
    "\n",
    "def optimize(X, y, y_hat, w):\n",
    "    dw = np.dot((y_hat-y).T, X).T/n + _lambda/m*w\n",
    "    new_w = w - 0.05 * dw\n",
    "    return new_w"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 526,
   "metadata": {},
   "outputs": [],
   "source": [
    "_lambda=0\n",
    "w = np.zeros((14,1))\n",
    "losses=[]\n",
    "losses_test=[]\n",
    "for i in range(10000):\n",
    "    y_hat = objective(X_train, w)\n",
    "    w = optimize(X_train, y_train, y_hat, w)\n",
    "    loss = cost(y_train, y_hat, w, n_train)\n",
    "    losses.append(loss)\n",
    "    y_hat_test = objective(X_test, w)\n",
    "    loss_test = cost(y_test, y_hat_test, w, n_test)\n",
    "    losses_test.append(loss_test)\n",
    "losses_test=np.array(losses_test)    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 527,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.0463505436877951"
      ]
     },
     "execution_count": 527,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "losses_test[-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 528,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(losses, label='train')\n",
    "plt.plot(losses_test, label='test')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 532,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYQAAAD4CAYAAADsKpHdAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3df5RcZZ3n8fe3qqt/pztJp5N0fmgCE5HIj4ARgjiOimiSWQnsrCy6gDqOkTNmldlhxrBzHHX27A7j8dd4Fok4xsFxBBnRIaNRQAYGV0HSiREDIRAgkE6apMnPTtK/quq7f9zbndvV1d3V6equ7r6f1zl1qu5zn+fe5wlan77PvXWvuTsiIiKJUndAREQmBgWCiIgACgQREQkpEEREBFAgiIhIqKzUHRiJWbNm+aJFi0rdDRGRSWXr1q2vuXvjcPUmVSAsWrSI5ubmUndDRGRSMbOXC6mnKSMREQEUCCIiElIgiIgIMMnOIYiIjFRPTw8tLS10dnaWuitjrrKykgULFpBKpc6ovQJBRKa0lpYWpk2bxqJFizCzUndnzLg7hw4doqWlhcWLF5/RNjRlJCJTWmdnJw0NDVM6DADMjIaGhlEdCSkQRGTKm+ph0Gu044xFIDy88wBff3R3qbshIjKhxSIQHnuujW/8x4ul7oaIxNTRo0f5+te/PuJ2q1ev5ujRo2PQo/xiEQiVqSSdPZlSd0NEYmqwQMhkhv5e2rx5M9OnTx+rbg0Qi6uMKlNJutJZslknkYjHXKKITBzr16/nhRdeYNmyZaRSKWpra2lqamL79u0888wzXH311ezdu5fOzk4+9alPsXbtWuD07XpOnDjBqlWreNvb3savfvUr5s+fz/33309VVVVR+xmbQADoSmepKk+WuDciUiqf/7eneWb/8aJuc+m8Oj77vjcNWee2225jx44dbN++nUcffZQ//MM/ZMeOHX2Xh27cuJGZM2fS0dHBW97yFv7oj/6IhoaGftt4/vnnufvuu/nmN7/Jtddey3333cf1119f1LHEYsqoKhUMs0PTRiIyAVxyySX9fivwta99jQsvvJAVK1awd+9enn/++QFtFi9ezLJlywB485vfzJ49e4rer1gdIeg8gki8DfeX/Hipqanp+/zoo4/y85//nMcff5zq6mre8Y535P0tQUVFRd/nZDJJR0dH0fsVjyOEcJpIRwgiUgrTpk2jvb0977pjx44xY8YMqqurefbZZ3niiSfGuXenxeoIoaNbgSAi46+hoYHLL7+c8847j6qqKubMmdO3buXKlWzYsIELLriAc845hxUrVpSsn7EKhK60AkFESuN73/te3vKKigp++tOf5l3Xe55g1qxZ7Nixo6/8lltuKXr/IC5TRn1HCNkS90REZOIqKBDMbKWZ7TKz3Wa2Ps/6N5rZ42bWZWa3RMrPMbPtkddxM7s5XPc5M9sXWbe6eMPqrzK8ykgnlUVEBjfslJGZJYHbgSuBFmCLmW1y92ci1Q4DnwSujrZ1913Assh29gE/ilT5irt/cVQjKEDfEYICQURkUIUcIVwC7Hb3F929G7gHWBOt4O4H3X0L0DPEdq4AXnD3gh72XEy67FREZHiFBMJ8YG9kuSUsG6nrgLtzytaZ2VNmttHMZuRrZGZrzazZzJrb2trOYLcKBBGRQhQSCPlu/uMj2YmZlQNXAf8SKb4DOJtgSqkV+FK+tu5+p7svd/fljY2NI9ltn9PnEHRSWURkMIUEQguwMLK8ANg/wv2sAra5+4HeAnc/4O4Zd88C3ySYmhoTlTqHICIldKa3vwb46le/yqlTp4rco/wKCYQtwBIzWxz+pX8dsGmE+/kAOdNFZtYUWbwG2MEYSSUTpJKmQBCRkpgsgTDsVUbunjazdcADQBLY6O5Pm9lN4foNZjYXaAbqgGx4aelSdz9uZtUEVyh9PGfTXzCzZQTTT3vyrC+qyjI9E0FESiN6++srr7yS2bNnc++999LV1cU111zD5z//eU6ePMm1115LS0sLmUyGz3zmMxw4cID9+/fzzne+k1mzZvHII4+MaT8L+qWyu28GNueUbYh8fpVgKilf21NAQ57yG0bU01GqLFcgiMTeT9fDq78r7jbnng+rbhuySvT21w8++CA/+MEPePLJJ3F3rrrqKh577DHa2tqYN28eP/nJT4DgHkf19fV8+ctf5pFHHmHWrFnF7XcesfilMgQnlnVSWURK7cEHH+TBBx/koosu4uKLL+bZZ5/l+eef5/zzz+fnP/85n/70p/nFL35BfX39uPctFvcyguDHabq5nUjMDfOX/Hhwd2699VY+/vGBs+Rbt25l8+bN3HrrrbznPe/hr//6r8e1bzE6QkjSqZvbiUgJRG9//d73vpeNGzdy4sQJAPbt28fBgwfZv38/1dXVXH/99dxyyy1s27ZtQNuxFpsjhEodIYhIiURvf71q1So++MEPctlllwFQW1vLd7/7XXbv3s1f/MVfkEgkSKVS3HHHHQCsXbuWVatW0dTUNOYnlc19RL8xK6nly5d7c3PzGbW9ceOTHDvVzf3r3lbkXonIRLZz507OPffcUndj3OQbr5ltdfflw7WNzZRRlU4qi4gMKUaBkNQP00REhhCbQKhM6XcIInE1mabGR2O044xVIOgIQSR+KisrOXTo0JQPBXfn0KFDVFZWnvE2YnWVUZfOIYjEzoIFC2hpaeFMb58/mVRWVrJgQd6bRhQkNoFQlUrSncmSyTrJRL47eovIVJRKpVi8eHGpuzEpxGjKSM9VFhEZSmwCoapcz0QQERlKbAKh7yE5+rWyiEhesQsETRmJiOQXm0Co1mM0RUSGFJ9ACM8hnNKUkYhIXvEJhIrgCttT3ekS90REZGIqKBDMbKWZ7TKz3Wa2Ps/6N5rZ42bWZWa35KzbY2a/M7PtZtYcKZ9pZg+Z2fPh+4zRD2dwOkIQERnasIFgZkngdmAVsBT4gJktzal2GPgk8MVBNvNOd1+Wc/vV9cDD7r4EeDhcHjN9gdClQBARyaeQI4RLgN3u/qK7dwP3AGuiFdz9oLtvAXpGsO81wF3h57uAq0fQdsSqyzVlJCIylEICYT6wN7LcEpYVyoEHzWyrma2NlM9x91aA8H12vsZmttbMms2seTT3Iuk9QjipKSMRkbwKCYR8N/4ZyW0DL3f3iwmmnD5hZm8fQVvc/U53X+7uyxsbG0fStJ+KsgTJhOkIQURkEIUEQguwMLK8ANhf6A7cfX/4fhD4EcEUFMABM2sCCN8PFrrNETtxEHvtOapTSZ1UFhEZRCGBsAVYYmaLzawcuA7YVMjGzazGzKb1fgbeA+wIV28CPhR+/hBw/0g6PiKP/i18ezXVFUmdVBYRGcSwt79297SZrQMeAJLARnd/2sxuCtdvMLO5QDNQB2TN7GaCK5JmAT8ys959fc/dfxZu+jbgXjP7KPAK8P7iDi2ivAa6T1JdWcYp/VJZRCSvgp6H4O6bgc05ZRsin18lmErKdRy4cJBtHgKuKLino1E+DdId1KbgVJfOIYiI5BOPXyqX1wAwM9WjcwgiIoOIVSDMKOvRVUYiIoOISSDUAjA91aUjBBGRQcQjECqCQKhPdCsQREQGEY9ACKeM6pNdmjISERlErAJhWqJLt64QERlETAIhmDKqtS6601nSmWyJOyQiMvHELBA6AfTjNBGRPGISCMGUUTVhIOj2FSIiA8QkEIIjhL5A0IllEZEB4hEIyTIoq6TSOwA9RlNEJJ94BAJAeQ2V3nuEoEAQEckVq0Aoz5wC4KSmjEREBohRINRSng0CoUNHCCIiA8QqEFLp8AhBt8AWERkgRoFQQzKcMtI5BBGRgeIVCD0nAZ1DEBHJp6BAMLOVZrbLzHab2fo8699oZo+bWZeZ3RIpX2hmj5jZTjN72sw+FVn3OTPbZ2bbw9fq4gxpEOW1WM9JUknjRKcCQUQk17CP0DSzJHA7cCXQAmwxs03u/kyk2mHgk8DVOc3TwJ+7+zYzmwZsNbOHIm2/4u5fHPUoClFRi3WfpLaijBM6hyAiMkAhRwiXALvd/UV37wbuAdZEK7j7QXffAvTklLe6+7bwczuwE5hflJ6PVHkNdJ+ktrJMRwgiInkUEgjzgb2R5RbO4EvdzBYBFwG/jhSvM7OnzGyjmc0Y6TZHpLwW0p3UlSdo1xGCiMgAhQSC5SnzkezEzGqB+4Cb3f14WHwHcDawDGgFvjRI27Vm1mxmzW1tbSPZbX/h/Yxml3frCEFEJI9CAqEFWBhZXgDsL3QHZpYiCIN/dvcf9pa7+wF3z7h7FvgmwdTUAO5+p7svd/fljY2Nhe52oMo6AGalunQOQUQkj0ICYQuwxMwWm1k5cB2wqZCNm5kB3wJ2uvuXc9Y1RRavAXYU1uUzVBEEQkNZpwJBRCSPYa8ycve0ma0DHgCSwEZ3f9rMbgrXbzCzuUAzUAdkzexmYClwAXAD8Dsz2x5u8n+6+2bgC2a2jGD6aQ/w8eIOLUd4hDCzrJP2zp5hKouIxM+wgQAQfoFvzinbEPn8KsFUUq7/R/5zELj7DYV3swjCI4QZiQ7adQ5BRGSA+PxSubIegPpEB13pLN1pPVdZRCQqPoEQHiFMM93gTkQkn/gEQngOodaDQNCJZRGR/uITCGUVkKygJgwEnUcQEekvPoEAUFlHVTa446mOEERE+otXIFTUUdkXCLr0VEQkKl6BUFlHefoEoCkjEZFc8QqEijpSPcGtlDRlJCLSX7wCobKOsp52AN3gTkQkR7wCoaIe62onYTpCEBHJFa9AqKzDuo5TW1GmcwgiIjniFQgVddB9gvqKhI4QRERyxCsQwl8rz67o0R1PRURyxCwQghvczS7v0pSRiEiOeAVCeIO72eVdHOvQEYKISFS8AqFqBgCzy04pEEREcsQyEBqTJxUIIiI54hUI1TMBmJE4SXtnmkzWS9whEZGJo6BAMLOVZrbLzHab2fo8699oZo+bWZeZ3VJIWzObaWYPmdnz4fuM0Q9nGOERwnR672ekowQRkV7DBoKZJYHbgVXAUuADZrY0p9ph4JPAF0fQdj3wsLsvAR4Ol8dWqgrKqqj34PYVmjYSETmtkCOES4Dd7v6iu3cD9wBrohXc/aC7bwFyv2GHarsGuCv8fBdw9RmOYWSqZ1KTDQLheIcuPRUR6VVIIMwH9kaWW8KyQgzVdo67twKE77PzbcDM1ppZs5k1t7W1FbjbIVTNoDpzDNARgohIVCGBYHnKCj0bO5q2QWX3O919ubsvb2xsHEnT/KpmUNGjQBARyVVIILQACyPLC4D9BW5/qLYHzKwJIHw/WOA2R6d6JuXdCgQRkVyFBMIWYImZLTazcuA6YFOB2x+q7SbgQ+HnDwH3F97tUaiaQbLzCKBAEBGJKhuugrunzWwd8ACQBDa6+9NmdlO4foOZzQWagToga2Y3A0vd/Xi+tuGmbwPuNbOPAq8A7y/24PKqmgmdR0glFQgiIlHDBgKAu28GNueUbYh8fpVgOqigtmH5IeCKkXS2KKpmYNk08yrTCgQRkYh4/VIZ+n6tPL+yk+MKBBGRPvELhKogEOaV6wZ3IiJRMQyE4PYVc1IdCgQRkYj4BUJ1AwBzdMdTEZF+4hcItcGP2xoTxxQIIiIR8QuEyumQLKeBYxzv7NEtsEVEQvELBDOoaWRm9gjucPRUd6l7JCIyIcQvEABqGpmWPQrA4ZMKBBERiGsg1M6mpvswoEAQEekVz0ComU1F12uAAkFEpFc8A6F2NmWdhzCyHNY5BBERIMaBYNk09Zzk8AkFgogIxDUQaoLfIryu4qSOEEREQvEMhNrgaZ2LK0/qHIKISCiegVATBMLC8nYFgohIKJ6BEB4hzC87rkAQEQnFMxCqZkBZFU12mCMKBBERIK6BYAZ185jNIQ6d7MZd9zMSESkoEMxspZntMrPdZrY+z3ozs6+F658ys4vD8nPMbHvkdTx83jJm9jkz2xdZt7q4QxtG/XxmptvoSmc51Z0Z112LiExEwz5T2cySwO3AlUALsMXMNrn7M5Fqq4Al4etS4A7gUnffBSyLbGcf8KNIu6+4+xeLMZARq1tAXesuIPi1ck1FQY+XFhGZsgo5QrgE2O3uL7p7N3APsCanzhrgOx54AphuZk05da4AXnD3l0fd62Kon09VVxtJMjqxLCJCYYEwH9gbWW4Jy0Za5zrg7pyydeEU00Yzm5Fv52a21syazay5ra2tgO4WqG4e5llmc5S29q7ibVdEZJIqJBAsT1nuWdgh65hZOXAV8C+R9XcAZxNMKbUCX8q3c3e/092Xu/vyxsbGArpboLoFADTZIQ4qEERECgqEFmBhZHkBsH+EdVYB29z9QG+Bux9w94y7Z4FvEkxNjZ/64ACmyQ5zsL1zXHctIjIRFRIIW4AlZrY4/Ev/OmBTTp1NwI3h1UYrgGPu3hpZ/wFypotyzjFcA+wYce9Hoy4IhLMrNGUkIgIFXGXk7mkzWwc8ACSBje7+tJndFK7fAGwGVgO7gVPAR3rbm1k1wRVKH8/Z9BfMbBnB1NKePOvHVmU9lE/jLA6zU4EgIjJ8IAC4+2aCL/1o2YbIZwc+MUjbU0BDnvIbRtTTYjODmYtYdPSgziGIiBDXXyr3mnkW87KttB3XOQQRkdgHQkNPK4dPnNLtK0Qk9mIfCElPMyv7GkdP9ZS6NyIiJRX7QABYZAd0HkFEYi/egTBjMQCL7FX9FkFEYi/egTCtiWyyMgiE4zpCEJF4i3cgJBJ4w9mcbfs1ZSQisRfvQACSc97EuckWWo91lLorIiIlFftAYM5S5nKIo4cOlronIiIlpUCY/SYAKg7vKnFHRERKS4EwZykAM048X+KOiIiUlgKhbj5dZdN4fXoPJ7rSpe6NiEjJKBDMOD79XM5LvETrUZ1YFpH4UiAA6aY3s9RepvW1I6XuiohIySgQgIrFK0hZhq5XtpW6KyIiJaNAAOqXvBWAVOuWEvdERKR0FAhActpsWmwuMw9vL3VXRERKpqAnppnZSuDvCR6h+Q/uflvOegvXryZ4hOaH3X1buG4P0A5kgLS7Lw/LZwLfBxYRPELzWncv2ST+rsplrDj5C8ikIVnQP8vEk81AzynoPgXpTvAMuAflng1fGbAEJMr6v5Kp/stlFZBIlnpEIjKOhv3mM7MkcDvBc5FbgC1mtsndn4lUWwUsCV+XAneE773e6e6v5Wx6PfCwu99mZuvD5U+f8UhGad+st1Kz92fQ8iS8/q2l6sZAmR44+goceQkOvwTH98PJNjj5WvjeBl3tQRCki3zH1kQZlFVBqjJ4L6s4/bnfe/hKVZ1+T1WF6yOvIddVTd4gFpkiCvl/4CXAbnd/EcDM7gHWANFAWAN8J3y28hNmNt3Mmty9dYjtrgHeEX6+C3iUEgZC1+veTvqVBNldD1JeqkDoOgH7mqH1t9D6VPB++MXgr/peiTKoaYSaWcH7zLOgsg5S1VBeE75XB1++lgz+yrdE/xceBE02A9keyKaDVyZ8z/YE63s6gpDpfU93Qk8npDuC987j+ddnzvBGgYnUwOAYNFiqI6GUr25YZ7AQSqaK8p9MZCopJBDmA3sjyy30/+t/sDrzgVbAgQfNzIFvuPudYZ05vYHh7q1mNvsM+l80TXPmsNXfwIU7fwJXfhbMxn6n2Qzs/TW88O/w0mOwb2vwhQxQvxDmXgBL1wRf+jMWwczFUDsXEhP81E82ezo0eo9cek7lX053BIEyZN0O6DwG7a9G6kdC6Ez0Hf0MFx7RdXlCqKwCkhVQVh6+V0CyPDxqylOmoyCZwAr5X2e+b8bcBxAPVedyd98ffuE/ZGbPuvtjhXbQzNYCawFe97rXFdpsxBY11HBP5jIuPfJtePUpaLpwbHaUzQRf/s/cD8/+BE4eDP6Sn3cRvPWTsOhymHcxVM8cm/2Ph0QiOFoprwEaxnZf2WzkKCUSFkMudw5dt/M4pA8ODKZiTMlZYmCADAiVodYNUT+ZCl/lwdFW7+doebI8PGcUfk6W9S8fjz+EZMIqJBBagIWR5QXA/kLruHvv+0Ez+xHBFNRjwIHeaSUzawLy3m40PKK4E2D58uW5QVQ0r2+o5seZFXy+/J9I/vb7xQ+E4/vhN9+Fbf8Ex16BVA0suRKWXgW/926orC/u/uIikQimyMqrx35fveHTdxTTAemuYIos3X36Pd0Jme7+6/KVZbqC5XTXwHWdxyNl0XXha8DfZEWSSA0MimQqUp4TNP3Ky/OEUlnw3nfxQu+FC6lgOjPfBQ0D6ka3kcxfPxlZH93fRD+anmAKCYQtwBIzWwzsA64DPphTZxOwLjy/cClwLPyirwES7t4efn4P8DeRNh8Cbgvf7x/1aEZhWmWKstoGnq5+Gxds/y6881aomDb6Dbf+Fn7xZdi5KbjKZ/EfwJWfg3NWB1MOMnn0C58SHsG5B1OLfWHRGZzzyfSE53+6w+Xu0+WZ7tPnhgasz7dumPLec0yZYwPLe/uQ7j59fip6Hmw89buiLjeEcsKjN4B6z70lysL2yZzyZPi5LPI5T3m/db3tE5HPve0TOdsKg6zftsqCWYSaWWP6zzVsILh72szWAQ8QXHa60d2fNrObwvUbgM0El5zuJrjs9CNh8znAj4KrUikDvufuPwvX3Qbca2YfBV4B3l+0UZ2hRQ013JO+hguOPwrN34bLP3nmG3v5cfjFl2D3Q1BRB5etg+UfCc4HiIyG2em/xCeLbHjJczYdhkZ6iIsawgsbsplI3ZxX30UR6cg2Bqlf0P4idT1z+lLtTPfp/XgmGEff5956mZw60fJwv8U4ovtv98GSd49+O0Mo6AyXu28m+NKPlm2IfHbgE3navQjknXtx90PAFSPp7Fh7fUMND+9eAGe9M/gyv/ADUNtY+Abc4YWHgyOCl38J1Q3wrs/AW/4EqqaPXcdFJrpEAkgEIRbHI+O+QMwJiryBkhs66SCcGn5vzLupSx4iFs+q5r5tXZy84n9T860/gJ/8Gbz/O8PPQ2Yz8OyPgyBo3Q5182Hl38HFN47P3LaITGzRQJzAdMYl4g1zgnMGz2Xmwbs/Czv/DX726fCQL4/uk7DtO3D7pXDvjcEPxN73Nfjkdlhxk8JARCYVHSFEnDM3DIQD7Vx02brgyqAnvg77tsFlfwpzzgvmFNt2Bb8deGYTdLcHvxd4/z/CuVfpdg8iMmkpECIWzqimMpVg16snghN3K/82uPz04b+BH/xx/8oV9XDu++DiG+B1l+n6bRGZ9BQIEYmE8YY503juQPvpwguvg/PfD/t/A0f2BEcAMxbD3PN1NCAiU4oCIccb5kzjP55r61+YSMKC5cFLRGSK0knlHOfMmUZbexdHTnaXuisiIuNKgZDjDeGJ5WdfbR+mpojI1KJAyHHevDoAfrfvaIl7IiIyvhQIORpqK5g/vYrfthwrdVdERMaVAiGPCxfW81SLjhBEJF4UCHlcsGA6ew93cFgnlkUkRhQIeVy4ILgRnY4SRCROFAh5nL+gHjPYvleBICLxoUDIo7aijHPn1vHkS4dL3RURkXGjQBjEirMa2PryEbrSJXrSk4jIOFMgDOKysxvoSmfZ/oqmjUQkHhQIg7hk0UzM4IkXNW0kIvFQUCCY2Uoz22Vmu81sfZ71ZmZfC9c/ZWYXh+ULzewRM9tpZk+b2acibT5nZvvMbHv4Wl28YY1efXWKpU11/OqF10rdFRGRcTFsIJhZErgdWAUsBT5gZktzqq0CloSvtcAdYXka+HN3PxdYAXwip+1X3H1Z+Or3zOaJ4A/e0Ejzy0c4dqqn1F0RERlzhRwhXALsdvcX3b0buAdYk1NnDfAdDzwBTDezJndvdfdtAO7eDuwE5hex/2Pq3UvnkMk6jz53sNRdEREZc4UEwnxgb2S5hYFf6sPWMbNFwEXAryPF68Ippo1mNiPfzs1srZk1m1lzW1tbvipjZtmC6cyqreChZw6M635FREqhkEDI92xIH0kdM6sF7gNudvfjYfEdwNnAMqAV+FK+nbv7ne6+3N2XNzY2FtDd4kkkjHefO5v/2NWmy09FZMorJBBagIWR5QXA/kLrmFmKIAz+2d1/2FvB3Q+4e8bds8A3CaamJpz3njeX9q40jzw7vkcnIiLjrZBA2AIsMbPFZlYOXAdsyqmzCbgxvNpoBXDM3VvNzIBvATvd/cvRBmbWFFm8BthxxqMYQ7//e7NonFbBD7e1lLorIiJjathnKrt72szWAQ8ASWCjuz9tZjeF6zcAm4HVwG7gFPCRsPnlwA3A78xse1j2P8Mrir5gZssIppb2AB8v2qiKqCyZ4Opl8/jHX+3h8MluZtaUl7pLIiJjwtxzTwdMXMuXL/fm5uZx3+/O1uOs+vtf8Ferz+Vjbz9r3PcvIjIaZrbV3ZcPV0+/VC7AuU11XLp4Jt/+5Uv0ZLKl7o6IyJhQIBToY79/FvuPdbL5d62l7oqIyJhQIBToXW+czdmNNdz+yG4y2ckzzSYiUigFQoESCePP33MOzx04wX1bdcWRiEw9CoQRWHXeXC563XS+9NAujnfq/kYiMrUoEEbAzPjs+95EW3sX/+cnO0vdHRGRolIgjNCyhdNZ+/azuWfLXh58+tVSd0dEpGgUCGfg5ncv4fz59fzZ97fz3IH2UndHRKQoFAhnoDKV5M4b30xVeRkf3vgkLx86WeouiYiMmgLhDDXVV3HXH7+Fjp4M//UbT7Cz9fjwjUREJjAFwii8aV49d69dgeNc8/Vfcm/zXibTrUBERKIUCKP0xrl1/Pi//z4XLpjOX/7gKW741pPselXnFURk8lEgFEHjtAq+97EV/K81b+K3e4/y3q8+xse+08xjz7XpV80iMmkMe/trKUwyYdxw2SLed+E8vv3LPdz1+B4eeuYAs6dVcMW5s3nr2bO49KyZzJ5WWequiojkpdtfj5HOngyP7jrIv/5mP7984TXaO9NAcDRxblMdb5hdy4IZVcybXsX8GVXMnlbJ9OoUqaQO2kSkuAq9/bWOEMZIZSrJyvOaWHleE+lMlh37j9O85zA7W9vZ2XqcX794iK70wFtp11aUMb06xYzqcqZVllFdnqSqvIzqVJKq8iTV4auqvIyKsgTlyQTlZQlSyQSppFEelqV63yUnlQIAAAgESURBVJMJysssfO+tF9QtSyQoSxiJRL5HYotI3CgQxkFZMsGyhdNZtnB6X5m7c+hkN/uOdLDvaAevnejiyMkejnZ0c/RUD0dOddPemebIqR46utN09GQ41Z2hoztDusjnJcwglUiQTBhlSaMsYSQTQWgkE0GYJBNBeVkyWFcWWe4Nln5182wnqN/bNkEyEdw0MGnB+kT43veyIKySCU6vi9QZvi39tlOWU6/fNpORNmF58ARYkfhQIJSImTGrtoJZtRVcGAmKQvRkspzqztCVztCTcbrTWXoyWbrTWbozWXrS2aA8k6E77X3rejLBqyudJZ11MtlgXSbrpLNOOhMtdzLZLOmMD6jbkz29rrMnSzqb6Vd32O1ks0yGmUoz+oXJ6YAKwiRh9L1bXzAFZda3LmgzWF2LbKc3hAbUDYPK7PR+k5ZTNxHZn52u2xumudtNJAqsm6fvRv8xWt5ygP5jzF8vWLac7eVtT+++hmlPtF/92ycMyGnXt+0EA/pG3r4yZf9YKCgQzGwl8PcEz1T+B3e/LWe9hetXEzxT+cPuvm2otmY2E/g+sIjgmcrXuvuR0Q9p6kslE9RXJYBUqbtyxjJhOGQ9eM+4k82e/ty3PkvfcjZSnq9NNgvpbDasR782ve/pbNimX1vI9q6L7jvSt0wm0sadrAdHedksQT133IPP2fDd+/Yd1g3LM9lo3aA8ncn2fe6t29uHaF13wv0H++6rG+6vdx/ZbORzZLu9/ZHRGzKsCANlyPA6HVIWDTD6h29vAP3tfz6ftyyaOaZjGjYQzCwJ3A5cCbQAW8xsk7s/E6m2ClgSvi4F7gAuHabteuBhd7/NzNaHy58u3tBkIuudtpHS6BcekWDLFx65YRa0D0MP+oLKc5ZPl4PTf1v0LQ/TPuxrsDxE+371hmgftiMnfKP1PGfbEPzBMPRYg3Ye3Wa0/aB9yt8+2Pbpz+5OdXlyzP93UcgRwiXAbnd/EcDM7gHWANFAWAN8x4NLlp4ws+lm1kTw1/9gbdcA7wjb3wU8igJBZFwEU1GQRKEspxVyjeN8YG9kuSUsK6TOUG3nuHsrQPg+O9/OzWytmTWbWXNbW1sB3RURkTNRSCDk+xMidxZysDqFtB2Su9/p7svdfXljY+NImoqIyAgUEggtwMLI8gJgf4F1hmp7IJxWInw/WHi3RUSk2AoJhC3AEjNbbGblwHXAppw6m4AbLbACOBZOAw3VdhPwofDzh4D7RzkWEREZhWFPKrt72szWAQ8QXDq60d2fNrObwvUbgM0El5zuJrjs9CNDtQ03fRtwr5l9FHgFeH9RRyYiIiOiexmJiExxhd7LSHdSExERQIEgIiKhSTVlZGZtwMtn2HwW8FoRuzNZxHHccRwzxHPccRwzjHzcr3f3Ya/bn1SBMBpm1lzIHNpUE8dxx3HMEM9xx3HMMHbj1pSRiIgACgQREQnFKRDuLHUHSiSO447jmCGe447jmGGMxh2bcwgiIjK0OB0hiIjIEBQIIiICxCQQzGylme0ys93h09kmLTNbaGaPmNlOM3vazD4Vls80s4fM7PnwfUakza3h2HeZ2Xsj5W82s9+F675mE/xBsWaWNLPfmNmPw+U4jHm6mf3AzJ4N/5tfNtXHbWZ/Fv5ve4eZ3W1mlVNxzGa20cwOmtmOSFnRxmlmFWb2/bD812a2aNhOefgs1qn6Irip3gvAWUA58Ftgaan7NYrxNAEXh5+nAc8BS4EvAOvD8vXA34Wfl4ZjrgAWh/8WyXDdk8BlBM+t+CmwqtTjG2bs/wP4HvDjcDkOY74L+JPwczkwfSqPm+ABWi8BVeHyvcCHp+KYgbcDFwM7ImVFGyfwp8CG8PN1wPeH7VOp/1HG4R/9MuCByPKtwK2l7lcRx3c/wTOrdwFNYVkTsCvfeAnuPHtZWOfZSPkHgG+UejxDjHMB8DDwrkggTPUx14VfjpZTPmXHzemnLM4kuBvzj4H3TNUxEzxmOBoIRRtnb53wcxnBL5ttqP7EYcqokEeATkrhIeBFwK8Z/JGkQz3etCVP+UT1VeAvgWykbKqP+SygDfh2OFX2D2ZWwxQet7vvA75IcEv8VoJnqzzIFB5zjmKOs6+Nu6eBY0DDUDuPQyCM+jGeE5GZ1QL3ATe7+/GhquYpK8rjTceLmf0n4KC7by20SZ6ySTXmUBnBlMId7n4RcJJgGmEwk37c4Zz5GoJpkXlAjZldP1STPGWTaswFOpNxjvjfIA6BUMgjQCcVM0sRhME/u/sPw+LBHkk61ONNF+Qpn4guB64ysz3APcC7zOy7TO0xQ9DfFnf/dbj8A4KAmMrjfjfwkru3uXsP8EPgrUztMUcVc5x9bcysDKgHDg+18zgEQiGPAJ00wisIvgXsdPcvR1YN9kjSTcB14RUHi4ElwJPh4Wi7ma0It3kjE/Qxpu5+q7svcPdFBP/9/t3dr2cKjxnA3V8F9prZOWHRFcAzTO1xvwKsMLPqsK9XADuZ2mOOKuY4o9v6LwT/vxn6KKnUJ1XG6cTNaoKrcV4A/qrU/RnlWN5GcNj3FLA9fK0mmBt8GHg+fJ8ZafNX4dh3EbnSAlgO7AjX/V+GOeE0EV7AOzh9UnnKjxlYBjSH/73/FZgx1ccNfB54NuzvPxFcWTPlxgzcTXCepIfgr/mPFnOcQCXwLwSPNn4SOGu4PunWFSIiAsRjykhERAqgQBAREUCBICIiIQWCiIgACgQREQkpEEREBFAgiIhI6P8DQAN9/5QDLywAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(losses[100:], label='train')\n",
    "plt.plot(losses_test[100:], label='test')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 537,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "losses=[]\n",
    "lambdas=[]\n",
    "for i in range(0, 100):\n",
    "    #_lambda=0\n",
    "    _lambda=i/100\n",
    "    w = np.zeros((14,1))\n",
    "    #losses=[]\n",
    "    #losses_test=[]\n",
    "    for i in range(1000):\n",
    "        y_hat = objective(X_train, w)\n",
    "        w = optimize(X_train, y_train, y_hat, w)\n",
    "    y_hat_test = objective(X_test, w)\n",
    "    loss=real_cost(y_test, y_hat_test, w, n_test)\n",
    "    losses.append(loss)\n",
    "    lambdas.append(_lambda)\n",
    "plt.plot(lambdas, losses)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 534,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYAAAAD4CAYAAADlwTGnAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3de5Ad5X3m8e9zztw0Gt01AqELkkEGC8ItY0FiysYhzgKJEU7KFZEYk4QskDWxyca7IUnVrl2p2nV5sb1JCqPCNlnYOBA7gUWbVcAsiePKGmONsAwSQiCEkGZGl9FtRtJczzm//aN7pMMw0pyRZnSk6edTdep0v91vn/fl0s/02zdFBGZmlj25ajfAzMyqwwFgZpZRDgAzs4xyAJiZZZQDwMwso2qq3YCxmDt3bixZsqTazTAzO6esX79+X0Q0Dy8/pwJgyZIltLa2VrsZZmbnFEnvjFTuISAzs4xyAJiZZZQDwMwsoxwAZmYZ5QAwM8soB4CZWUY5AMzMMuqcug/AzGwiRATFUlAoHf8ulc0XIygW0+/S8U+prF4pgkLxeFkxkm0Uy7fxnrpQjDj2++XlpWFlv3rNQpbOnTqu/XYAmFlFIpId3WCxxGAhGCiWGCyWKBST6UKpbLqYrpdOF0olBopBYWhZ6fg6QzvQofUGh9YrxbFtJstLZesFxdLx+WK67vCd+LHy4sjlpRLJ91n+WhQJfvbCWQ4As6wolZKdad9gkf5Cif7BEv2FdLpQTOdLx+YH0uny74FiUp5MlxhId9wD6fqDxShbVjq20x4sBv1l80M79okmQW0uR01e1ORETT5HTU7U5nPkc6ImL/JKymvzIidRmxf5nGisqTlWLylP6uRzQ9t6b3k+l2wvlxO1OZFPtz9UJ1knaUMuJ/I5yOdy6TqQk8p+I0cux7H6udzxbQ19cjq+3dyx307q5DT0G+8uz+eEpAn55+0AMBujiGTn2DNQpGegQM9Akd6BYvI9eHy+b7BI72CR3oESPYMF+gbS+cFkp378k84Xjk8P7cBPVz4n6vI56mrSTz5HfU2O2mFl0+tq0/WSHVlduk5tPqlfW5OjNqdj5TX5HHV5HZseWq8mn+y869Id99CyZJvJd81QvbLlQzvQfG5idnQ2MgeAZUJEcHSgyOG+QQ73FTjcV+BIf4HDfYMcSaeP9Bc42l/gSH+Ro8emCxwdKNDTXzz23TNYpDjGMYO6mhxTavNMqc3TUJujoTbPlLo8DTV55jbV0FCbTz856mvy1NfmaEi/62vKymuSuvXpzru+Jik/Pj1UnpR5h2on4wCwc8bQTvzg0QEO9QxysGeArt5BDvUO0jU03TNId98g3b0FunqT6WSHP1jROO+U2jxT62toqk++p9bX0NxUT+OcGprqamisz9NYl6exroap6feUuqRsSjrfWJfs6KfUDe3w894R21nJAWBVdbS/QOfhfjqP9LP/SD/7jgyw/8gA+4/2s//oAAeODHCwZ4AD6U7/ZOPQDbU5ZkypPfaZP6OB95/XxIwptUxrqGVaQ03Z9/HpZIef7NBr8r4y2rKjogCQdBPw50Ae+GZEfGnY8t8E/iidPQL8XkT8VNIi4HHgfKAEPBIRf57W+QLwb4HOtN6fRMTa0+uOnS36C0X2dPWzq6uX3d197OnuY3dXP3sO97G3u4+9h/vpPNxPz0BxxPozptQyZ2ods6bWsWh2I1cunMnMqbXMbqxjVmNSPrOxlplTapnRmOzw62vyZ7iXZue2UQNAUh54CPgY0Aask7QmIl4rW+1t4CMRcVDSzcAjwLVAAfjDiHhZ0jRgvaTny+p+LSIeHM8O2ZnRN1hk54Eedhzooe1gL20Hk++OQ720H+pj35H+99RprMtz3vQG5k2r54qFM5k3rZ7mafU0N9Uzd1o9c5vqmNtUz+ypddT6L3GzCVfJEcAKYGtEbAOQ9CSwEjgWABHxw7L1fwQsTMt3AbvS6cOSNgMLyuva2WuwWOKd/T281XmEbZ1H2b7vKG/vP8o7+4+yp/vdO/j6mhwLZk1hwcwpfGD+dObPmML8mQ3Mn5F8zpvewLSG2ir1xMxGUkkALAB2ls23kfx1fyJ3Af84vFDSEuBq4KWy4vskfRpoJTlSODhCvbuBuwEWL15cQXNtrIql4J39R9m86zBb9hzmzT2HeWPPYd7Z30Oh7Mzp3KY6lsyZyvUXN3PhnEYunNPIotmNLJrVyNymugm7VtnMJkYlATDS/9UjXk8h6aMkAXD9sPIm4O+B+yOiOy1+GPizdFt/BnwF+J33/FDEIyRDSrS0tJzl9+ud/QrFEm/sOcKr7YfY2N7Nq+1dbNl9mN7BZCw+J7hwzlSWzWvipsvP56LmJi5qbmJp81Sm+y94s0mlkgBoAxaVzS8EOoavJOkK4JvAzRGxv6y8lmTn/+2IeGqoPCL2lK3zDeAfxtx6G9WhngHWv3OQddsP8vKOg7za1nVsZ99UX8NlF0xn1YpFfGD+dJbPn87F85poqPXJVLMsqCQA1gHLJC0F2oFVwG+UryBpMfAUcEdEvFFWLuBbwOaI+OqwOvPTcwQAnwA2nnIv7Jiu3kFe2rafH761nxff2s+WPYcBqM2Lyy6Ywa9/cBFXL57JFQtncuHsRnK+Pt0ss0YNgIgoSLoPeI7kMtBHI2KTpHvT5auB/wTMAb6ejgMXIqIF+BBwB/CqpA3pJocu9/yypKtIhoC2A/eMa88yIiLY1NHN97fs5ftbOnl5x0FKkVwT/8Els/n4lfP54JLZXLlopv+yN7N3UcS5M6ze0tISra2t1W5G1ZVKwbrtB3h2026+t2kP7Yd6AfiZBTP4yPubuX7ZXK5ePNPXxZsZAJLWp3+Uv4vvBD6HvNbRzTMb2nlmQwe7u/uoq8nx4WVz+dyNy7jh0mbmTWuodhPN7BziADjLHekv8MyGdp748Q42tndTkxMfeX8zf3zLpdz4gfNoqve/QjM7Nd57nKXe2X+UR//1bb67vo2egSKXnj+NL956GR+/8gJmT62rdvPMbBJwAJxlNrZ38fXvb+XZjbvJ58THr7yAO667kKsWzfSNVmY2rhwAZ4k39hzmq997g2c37WZ6Qw33fOQifuvnl3DedI/rm9nEcABU2b4j/Xz52df57vo2ptbVcP8vLuN3rl/qu27NbMI5AKqkUCzx7Zd28JXvbaF3sMjvXr+Uf3fDxczy+L6ZnSEOgCrYuvcI//47G3ilrYvrL57LF269jIvnNVW7WWaWMQ6AMygiePzFd/gvazczpS7PX95+Nb9yxXyf3DWzqnAAnCFdvYP8wd9u4J9e38sNlzTz5V+7gnk+wWtmVeQAOAO2dR7hdx9vZcf+Hr5462V8+ucu9F/9ZlZ1DoAJ9oM3OvnM37xMbT7Ht3/3Wq5935xqN8nMDHAATKhnN+7m9594mYuam/jGp1tYNLux2k0yMzvGATBB1r66i88+8RN+ZuEMHvudFb6u38zOOrlqN2Ay+t8/7eD3n/gJVy2ayePe+ZvZWcpHAOPsh2/t4w/+dgM/e+Es/uq3PshUP63TzM5SPgIYR2/vO8rv/fXLLJk7lW/e2eKdv5md1SoKAEk3SdoiaaukB0ZY/puSXkk/P5R05Wh1Jc2W9LykN9PvWePTpero6h3krsfWkRN8684WD/uY2Vlv1ACQlAceAm4GlgO3S1o+bLW3gY9ExBXAnwGPVFD3AeCFiFgGvJDOn5NKpeD3n/gJOw/0sPpTP8uFc6ZWu0lmZqOq5AhgBbA1IrZFxADwJLCyfIWI+GFEHExnfwQsrKDuSuCxdPox4LZT70Z1Pf7idn7wRidfuPUyX+dvZueMSgJgAbCzbL4tLTuRu4B/rKDueRGxCyD9njfSxiTdLalVUmtnZ2cFzT2ztu87ypeefZ2PXtLMb6xYXO3mmJlVrJIAGOmZBTHiitJHSQLgj8Za90Qi4pGIaImIlubm5rFUnXClUvAf/u6n1OZz/NdfvcKPdzCzc0olAdAGLCqbXwh0DF9J0hXAN4GVEbG/grp7JM1P684H9o6t6dX3Vz/czrrtB/nPH7+M82f4wW5mdm6pJADWAcskLZVUB6wC1pSvIGkx8BRwR0S8UWHdNcCd6fSdwDOn3o0zr+NQL//tudf5hUvn8WvXnGxEzMzs7DTqheoRUZB0H/AckAcejYhNku5Nl68G/hMwB/h6OgxSSIdtRqybbvpLwHck3QXsAD45zn2bUH/5T29SLAVfvPUyD/2Y2TlJEWMakq+qlpaWaG1trXYzeHvfUX7xq//Cp65dzBdXXl7t5piZnZSk9RHRMrzcdwKfgq89/wZ1+Ryf+YWLq90UM7NT5gAYo9c6ulnz0w5++0NLmDfNJ37N7NzlABijrz6/hWkNNdzz4Yuq3RQzs9PiABiDzbu6+b+b93LPh9/HjEY/68fMzm0OgDF44sc7qKvJ8anrLqx2U8zMTpsDoEK9A0We/kk7t1x+PjMb66rdHDOz0+YAqND/eXUXh/sKrPLzfsxsknAAVOjJH+/gfXOncu3S2dVuipnZuHAAVODNPYdpfecgq1Ys8l2/ZjZpOAAq8OS6ndTmxa9ds3D0lc3MzhEOgFH0DRZ56uU2fmn5+cxpqq92c8zMxo0DYBT/b+s+DvYM8skW//VvZpOLA2AU39/SSWNdnp+7yK96NLPJxQFwEhHBP2/Zy89fNJf6mny1m2NmNq4cACfxVudR2g72csMlZ9erKM3MxoMD4CS+vyV5S6UDwMwmIwfASfzLG51cPK+JhbMaq90UM7NxV1EASLpJ0hZJWyU9MMLySyW9KKlf0ufLyi+RtKHs0y3p/nTZFyS1ly27Zfy6dfp6Bgq8tO0AN7zff/2b2eQ06juBJeWBh4CPAW3AOklrIuK1stUOAJ8FbiuvGxFbgKvKttMOPF22ytci4sHT6sEEefGt/QwUS9xwybxqN8XMbEJUcgSwAtgaEdsiYgB4ElhZvkJE7I2IdcDgSbZzI/BWRLxzyq09g4Yu//zg0lnVboqZ2YSoJAAWADvL5tvSsrFaBTwxrOw+Sa9IelTSiHtaSXdLapXU2tnZeQo/O3bHL/+c48s/zWzSqiQARnr6WYzlRyTVAbcC3y0rfhi4iGSIaBfwlZHqRsQjEdESES3NzWdmPH7bvuTyz494+MfMJrFKAqANWFQ2vxDoGOPv3Ay8HBF7hgoiYk9EFCOiBHyDZKjprLB++0EAPuS7f81sEqskANYByyQtTf+SXwWsGePv3M6w4R9J88tmPwFsHOM2J8zGji6a6mtYMmdqtZtiZjZhRr0KKCIKku4DngPywKMRsUnSveny1ZLOB1qB6UApvdRzeUR0S2okuYLonmGb/rKkq0iGk7aPsLxqNrZ3sXz+dHI5P/vfzCavUQMAICLWAmuHla0um95NMjQ0Ut0e4D1jKRFxx5haeoYUS8HmXYf59Q8uGn1lM7NzmO8EHubtfUfoHSxy+YIZ1W6KmdmEcgAMs6mjG4DLF0yvckvMzCaWA2CYje1d1NXkuKi5qdpNMTObUA6AYTZ1dPOB86dRm/c/GjOb3LyXKxMRyRVAF3j838wmPwdAmbaDvXT3FTz+b2aZ4AAos6mjC4DLfARgZhngACizsb2bfE5cev60ajfFzGzCOQDKbOroYtm8Jhpq/QRQM5v8HABlNnZ0s/wCj/+bWTY4AFJ7u/voPNzP5R7/N7OMcACkhu4AvsxHAGaWEQ6A1Nv7jgJw8TzfAWxm2eAASLUf6qWhNsfsqXXVboqZ2RnhAEi1H+xlwcwpSH4HgJllgwMg1X6olwWzGqvdDDOzM8YBkGo/lBwBmJllRUUBIOkmSVskbZX0wAjLL5X0oqR+SZ8ftmy7pFclbZDUWlY+W9Lzkt5Mv2edfndOTc9AgQNHB1g4ywFgZtkxagBIygMPATcDy4HbJS0fttoB4LPAgyfYzEcj4qqIaCkrewB4ISKWAS+k81XRcagXwEcAZpYplRwBrAC2RsS2iBgAngRWlq8QEXsjYh0wOIbfXgk8lk4/Btw2hrrjqv1QHwALfARgZhlSSQAsAHaWzbelZZUK4HuS1ku6u6z8vIjYBZB+zxvDNsdV+8HkCOACHwGYWYbUVLDOSNdFxhh+40MR0SFpHvC8pNcj4geVVk5D426AxYsXj+FnK9d+qId8Tpw3rX5Ctm9mdjaq5AigDVhUNr8Q6Kj0ByKiI/3eCzxNMqQEsEfSfID0e+8J6j8SES0R0dLc3Fzpz45J+8Fezp/eQI1fA2lmGVLJHm8dsEzSUkl1wCpgTSUblzRV0rShaeCXgI3p4jXAnen0ncAzY2n4eEruAfDwj5lly6hDQBFRkHQf8ByQBx6NiE2S7k2Xr5Z0PtAKTAdKku4nuWJoLvB0endtDfA3EfFsuukvAd+RdBewA/jk+Hatcu0He7nufXOq9fNmZlVRyTkAImItsHZY2eqy6d0kQ0PDdQNXnmCb+4EbK27pBCkUS+zu7vMRgJllTuYHvXd391EK3wNgZtmT+QAYugTURwBmljUOAN8FbGYZ5QDwTWBmllEOgEO9zG2qo6E2X+2mmJmdUQ4APwbazDLKAeCbwMwsozIdABFBh48AzCyjMh0A+48O0DdYcgCYWSZlOgCO3wPgdwGbWfZkOwB8D4CZZVimA2BXV/ImsAtmNlS5JWZmZ16mA6CrZwAJpjfUVrspZmZnXLYDoHeQ6Q215HIjvfTMzGxyy3QAHOodZGaj//o3s2zKdAB09Q4yY4oDwMyyyQHgADCzjMp2APQMMt0BYGYZVVEASLpJ0hZJWyU9MMLySyW9KKlf0ufLyhdJ+mdJmyVtkvS5smVfkNQuaUP6uWV8ulS5rt5BZjoAzCyjRn0nsKQ88BDwMaANWCdpTUS8VrbaAeCzwG3DqheAP4yIlyVNA9ZLer6s7tci4sHT7sUpiAgPAZlZplVyBLAC2BoR2yJiAHgSWFm+QkTsjYh1wOCw8l0R8XI6fRjYDCwYl5afpp6BIoVSOADMLLMqCYAFwM6y+TZOYScuaQlwNfBSWfF9kl6R9KikWSeod7ekVkmtnZ2dY/3ZEzrUm2SVA8DMsqqSABjpLqkYy49IagL+Hrg/IrrT4oeBi4CrgF3AV0aqGxGPRERLRLQ0NzeP5WdPqqsnCQDfB2BmWVVJALQBi8rmFwIdlf6ApFqSnf+3I+KpofKI2BMRxYgoAd8gGWo6Y7rSIwBfBWRmWVVJAKwDlklaKqkOWAWsqWTjkgR8C9gcEV8dtmx+2ewngI2VNXl8dHkIyMwybtSrgCKiIOk+4DkgDzwaEZsk3ZsuXy3pfKAVmA6UJN0PLAeuAO4AXpW0Id3kn0TEWuDLkq4iGU7aDtwzvl07ua7eAcABYGbZNWoAAKQ77LXDylaXTe8mGRoa7l8Z+RwCEXFH5c0cf0NHADMb66rZDDOzqsnsncBdvYPkc2JqXb7aTTEzq4pMB8CMKbUkpynMzLInswFwqMd3AZtZtmU2APwYCDPLuswGQLcDwMwyLrMB4CMAM8u6zAbAIQeAmWVcJgOgVAq6/T5gM8u4TAbAkYECpfBdwGaWbZkMgKEngfpBcGaWZdkMAD8Izsws2wHg9wGbWZZlOgBm+CSwmWVYJgPgUI+HgMzMMhkAPgdgZpbhAKjL55hS60dBm1l2ZTYApvtR0GaWcRUFgKSbJG2RtFXSAyMsv1TSi5L6JX2+krqSZkt6XtKb6fes0+9OZbp6B5gxpaKXoZmZTVqjBoCkPPAQcDPJe35vl7R82GoHgM8CD46h7gPACxGxDHghnT8j/CA4M7PKjgBWAFsjYltEDABPAivLV4iIvRGxDhgcQ92VwGPp9GPAbafYhzHr6h30u4DNLPMqCYAFwM6y+ba0rBInq3teROwCSL/njbQBSXdLapXU2tnZWeHPnpyPAMzMKguAkc6URoXbP526ycoRj0RES0S0NDc3j6XqCfl1kGZmlQVAG7CobH4h0FHh9k9Wd4+k+QDp994Kt3laiqXgcF/BD4Izs8yrJADWAcskLZVUB6wC1lS4/ZPVXQPcmU7fCTxTebNP3eE+PwfIzAxg1GshI6Ig6T7gOSAPPBoRmyTdmy5fLel8oBWYDpQk3Q8sj4jukeqmm/4S8B1JdwE7gE+Od+dG4ruAzcwSFV0MHxFrgbXDylaXTe8mGd6pqG5avh+4cSyNHQ9+DpCZWSJzdwIfexS0nwRqZhmX2QDwEYCZZZ0DwMwsozIbAL4M1MyyLnMB0N07SH1NjgY/CtrMMi5zAeDHQJiZJTIXAN19gx7+MTMjgwHgIwAzs0TmAqC7t8D0Br8MxswscwHgIwAzs0TmAsDnAMzMEpkKgFIp6O4dZHqDA8DMLFMBcHSgQCl8F7CZGWQsALr7CgBMn+KTwGZmmQqALj8K2szsmEwFQHf6NjCfAzAzy1gA+EFwZmbHVRQAkm6StEXSVkkPjLBckv4iXf6KpGvS8kskbSj7dKevi0TSFyS1ly27ZXy79l7dfhS0mdkxo54NlZQHHgI+BrQB6yStiYjXyla7GViWfq4FHgaujYgtwFVl22kHni6r97WIeHA8OlIJHwGYmR1XyRHACmBrRGyLiAHgSWDlsHVWAo9H4kfATEnzh61zI/BWRLxz2q0+Rd19BSSYVu+rgMzMKgmABcDOsvm2tGys66wCnhhWdl86ZPSopFkj/bikuyW1Smrt7OysoLkn1t07SFN9DbmcTms7ZmaTQSUBMNLeMsayjqQ64Fbgu2XLHwYuIhki2gV8ZaQfj4hHIqIlIlqam5sraO6Jdfs5QGZmx1QSAG3AorL5hUDHGNe5GXg5IvYMFUTEnogoRkQJ+AbJUNOE6u7zYyDMzIZUEgDrgGWSlqZ/ya8C1gxbZw3w6fRqoOuArojYVbb8doYN/ww7R/AJYOOYWz9GfhKomdlxo54NjYiCpPuA54A88GhEbJJ0b7p8NbAWuAXYCvQAvz1UX1IjyRVE9wzb9JclXUUyVLR9hOXjrru3wJK5jRP9M2Zm54SKLoeJiLUkO/nystVl0wF85gR1e4A5I5TfMaaWjgMfAZiZHZepO4F9DsDM7LjMBMBgsUTPQNFHAGZmqcwEQLfvAjYze5fMBECXnwNkZvYumQkAvwzGzOzdshMAvX4XgJlZucwEgIeAzMzeLTMBcOxtYA4AMzMgQwHgIwAzs3fLTAB09xaoy+eor8lMl83MTioze8Ou3kGmT6lF8rsAzMwgQwHQ3TfoS0DNzMpkJwD8IDgzs3fJVAD4HgAzs+OyEwB9BV8CamZWJjMBkLwLwOcAzMyGZCIAIsJDQGZmw2QiAHoGihRK4ZPAZmZlKgoASTdJ2iJpq6QHRlguSX+RLn9F0jVly7ZLelXSBkmtZeWzJT0v6c30e9b4dOm9/BgIM7P3GjUAJOWBh4CbgeXA7ZKWD1vtZmBZ+rkbeHjY8o9GxFUR0VJW9gDwQkQsA15I5yeEHwNhZvZelRwBrAC2RsS2iBgAngRWDltnJfB4JH4EzJQ0f5TtrgQeS6cfA24bQ7vHpLs3fReAzwGYmR1TSQAsAHaWzbelZZWuE8D3JK2XdHfZOudFxC6A9HveSD8u6W5JrZJaOzs7K2jue/kIwMzsvSoJgJEenhNjWOdDEXENyTDRZyR9eAztIyIeiYiWiGhpbm4eS9Vjjr8P2JeBmpkNqSQA2oBFZfMLgY5K14mIoe+9wNMkQ0oAe4aGidLvvWNtfKWOnQT2EJCZ2TGVBMA6YJmkpZLqgFXAmmHrrAE+nV4NdB3QFRG7JE2VNA1A0lTgl4CNZXXuTKfvBJ45zb6c0NAQ0LQGHwGYmQ0ZdY8YEQVJ9wHPAXng0YjYJOnedPlqYC1wC7AV6AF+O61+HvB0+gjmGuBvIuLZdNmXgO9IugvYAXxy3Ho1THdvgab6GmrymbjtwcysIhX9SRwRa0l28uVlq8umA/jMCPW2AVeeYJv7gRvH0thT9f7zmvjlnxntoiQzs2zJxJjIqhWLWbVicbWbYWZ2VvGYiJlZRjkAzMwyygFgZpZRDgAzs4xyAJiZZZQDwMwsoxwAZmYZ5QAwM8soJTfxnhskdQLvnGL1ucC+cWzOuSKL/c5inyGb/c5in2Hs/b4wIt7zOOVzKgBOh6TWYW8ky4Qs9juLfYZs9juLfYbx67eHgMzMMsoBYGaWUVkKgEeq3YAqyWK/s9hnyGa/s9hnGKd+Z+YcgJmZvVuWjgDMzKyMA8DMLKMyEQCSbpK0RdJWSQ9Uuz0TQdIiSf8sabOkTZI+l5bPlvS8pDfT71nVbut4k5SX9BNJ/5DOZ6HPMyX9naTX03/nPzfZ+y3pD9L/tjdKekJSw2Tss6RHJe2VtLGs7IT9lPTH6b5ti6R/M5bfmvQBICkPPATcDCwHbpe0vLqtmhAF4A8j4gPAdcBn0n4+ALwQEcuAF9L5yeZzwOay+Sz0+c+BZyPiUpLXrm5mEvdb0gLgs0BLRFxO8n7yVUzOPv8P4KZhZSP2M/1/fBVwWVrn6+k+ryKTPgCAFcDWiNgWEQPAk8DKKrdp3EXEroh4OZ0+TLJDWEDS18fS1R4DbqtOCyeGpIXALwPfLCue7H2eDnwY+BZARAxExCEmeb9JXmE7RVIN0Ah0MAn7HBE/AA4MKz5RP1cCT0ZEf0S8DWwl2edVJAsBsADYWTbflpZNWpKWAFcDLwHnRcQuSEICmFe9lk2I/w78R6BUVjbZ+/w+oBP4q3To65uSpjKJ+x0R7cCDwA5gF9AVEd9jEvd5mBP187T2b1kIAI1QNmmvfZXUBPw9cH9EdFe7PRNJ0q8AeyNifbXbcobVANcAD0fE1cBRJsfQxwmlY94rgaXABcBUSZ+qbqvOCqe1f8tCALQBi8rmF5IcOk46kmpJdv7fjoin0uI9kuany+cDe6vVvgnwIeBWSdtJhvZ+QdJfM7n7DMl/020R8VI6/3ckgTCZ+/2LwNsR0RkRg8BTwM8zuftc7kT9PK39WxYCYB2wTNJSSXUkJ0zWVLlN406SSMaEN0fEV8sWrQHuTKfvBJ45022bKBHxxxGxMCKWkPx7/aeI+BSTuM8AEbEb2CnpkrToRuA1Jne/dwDXSWpM/1u/keQ812Tuc7kT9XMNsEpSvaSlwDLgxxVvNSIm/Y3m9/oAAACWSURBVAe4BXgDeAv402q3Z4L6eD3Jod8rwIb0cwswh+SqgTfT79nVbusE9f8G4B/S6UnfZ+AqoDX99/2/gFmTvd/AF4HXgY3A/wTqJ2OfgSdIznMMkvyFf9fJ+gn8abpv2wLcPJbf8qMgzMwyKgtDQGZmNgIHgJlZRjkAzMwyygFgZpZRDgAzs4xyAJiZZZQDwMwso/4/kCNuiPMdFg8AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "losses=[]\n",
    "for i in range(0, 100):\n",
    "    #_lambda=0\n",
    "    _lambda=i\n",
    "    w = np.zeros((14,1))\n",
    "    #losses=[]\n",
    "    #losses_test=[]\n",
    "    for i in range(1000):\n",
    "        y_hat = objective(X_train, w)\n",
    "        w = optimize(X_train, y_train, y_hat, w)\n",
    "        #loss = cost(y_train, y_hat, w, n_train)\n",
    "        #losses.append(loss)\n",
    "        #\n",
    "        #loss_test = cost(y_test, y_hat_test, w, n_test)\n",
    "        #losses_test.append(loss_test)\n",
    "    y_hat_test = objective(X_test, w)\n",
    "    loss=real_cost(y_test, y_hat_test, w, n_test)\n",
    "    losses.append(loss)\n",
    "plt.plot(losses)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
